﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SQLite;

namespace slitetest
{
    public partial class Form1 : Form
    {
        //数据库连接
        SQLiteConnection m_dbConnection;
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {

        }


        #region 三、创建数据库

        //SQLite 是文件型的数据库，创建很简单，直接指定一个数据库文件名，后缀名不一定非得是“.sqlite”，后缀随便命名为".db"也成。运行 SQLiteConnection.open 就会创建个空的指定名字的数据库文件。
        //由于它是文件型的，我们也可以直接用 System.IO.File.Create() 来创建一个空的文件。
        static void CreateDB()
        {
            string path = Application.StartupPath + "\\test.db";
            SQLiteConnection cn = new SQLiteConnection("data source=" + path);
            cn.Open();
            cn.Close();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            CreateDB();
        }
        #endregion

        #region 四、删除数据库
        /// sqlite 命令中好像没有提供删除整个数据库的命令，但是由于它是个文件型的，我们直接用 System.IO.File.Delete(string path) 方法来删除文件。
        static void DeleteDB()
        {
            string path = Application.StartupPath + "\\test.db";
            if (System.IO.File.Exists(path))
            {
                System.IO.File.Delete(path);
            }
        }
        private void button2_Click(object sender, EventArgs e)
        {
            DeleteDB();
        }
        #endregion

        #region 五、创建表
        // 开始要用到 SQL 命令了。建立一个表的顺序如下步骤（也可以用可视化工具 SQLiteExpert 来创建）：
        //1、建立数据库连接；
        //2、打开数据库（如果没有数据库，Open 也会新创建一个数据库）；
        //3、声明一个 SQLiteCommand 类，主要用来放置和运行 SQL 命令的；
        //4、把 SQLiteCommand 的 Connection 和 SQLiteConnection 联系起来（切记，经常忘^_^!）；
        //5、往 SQLiteCommand 的 CommandText 输入 SQL 语句 CREATE TABLE 语句，具体请参考 安装目录下的 SQLite.NET.chm 或 SQLite 创建表；
        //6、调用 SQLiteCommand.ExcuteNonQuery() 方法运行。

        static void CreateTable()
        {
            string path = Application.StartupPath + "\\test.db";
            SQLiteConnection cn = new SQLiteConnection("data source=" + path);
            if (cn.State != System.Data.ConnectionState.Open)
            {
                cn.Open();
                SQLiteCommand cmd = new SQLiteCommand();
                cmd.Connection = cn;
               // cmd.CommandText = "CREATE TABLE t1(time string，id varchar(4),score int)";
                cmd.CommandText = "CREATE TABLE IF NOT EXISTS t1(time string,id varchar(4),score int)";
                cmd.ExecuteNonQuery();
            }
            cn.Close();
        }
        private void button3_Click(object sender, EventArgs e)
        {
            CreateTable();
        }

        #endregion

        #region 六、删除表
        //和建立表的步骤一样，只是把 SQL 语句改了而已。
        static void DeleteTable()
        {
            string path = Application.StartupPath + "\\test.db";
            SQLiteConnection cn = new SQLiteConnection("data source=" + path);
            if (cn.State != System.Data.ConnectionState.Open)
            {
                cn.Open();
                SQLiteCommand cmd = new SQLiteCommand();
                cmd.Connection = cn;
                cmd.CommandText = "DROP TABLE IF EXISTS t1";
                cmd.ExecuteNonQuery();
            }
            cn.Close();
        }
        private void button4_Click(object sender, EventArgs e)
        {
            DeleteTable();
        }
        #endregion

        #region 七、查询表结构

        #endregion

        #region 八、更改表名

        //用 SQL 语句 ALTER TABLE 把 t1 表名改成 t3：
        private void button5_Click(object sender, EventArgs e)
        {
            string path = Application.StartupPath + "\\test.db";
            SQLiteConnection cn = new SQLiteConnection("data source=" + path);
            if (cn.State != System.Data.ConnectionState.Open)
            {
                cn.Open();
                SQLiteCommand cmd = new SQLiteCommand();
                cmd.Connection = cn;
                cmd.CommandText = "ALTER TABLE t3 RENAME TO t1";
                cmd.ExecuteNonQuery();
            }
            cn.Close();
        }

        #endregion

        #region 九、增添列
        //还是用 SQL 命令 ALTER TABLE ，下例中为 t1 表添加一个名为 age，数据类型为 int 的新列：
        private void button6_Click(object sender, EventArgs e)
        {
            string path = Application.StartupPath + "\\test.db";
            SQLiteConnection cn = new SQLiteConnection("data source=" + path);
            if (cn.State != System.Data.ConnectionState.Open)
            {
                cn.Open();
                SQLiteCommand cmd = new SQLiteCommand();
                cmd.Connection = cn;
                cmd.CommandText = "ALTER TABLE t1 ADD COLUMN age int";
                cmd.ExecuteNonQuery();
            }
            cn.Close();
        }
        #endregion

        #region 十、读取创建表的SOL语句

        #endregion

        #region 十一、更改列名
        //SQLite 中并没有提供直接更改列名与删除列的命令，有两种方式，
        //第一种是：
        //1、把目标表改名；
        //2、创建一个带有新列名的新表；
        //3、把旧表数据拷贝至新表（记得要 Connection.BeginTransaction())。

        //第二种是更改 sqlite_master 里面的 schema，很容易损坏数据库。
        //依据是 SQLite 每次连接时，其实都是依据 schema 里面的每个表创建时的 CREATE TABLE 语句来动态建立 column 的信息的，只要 column 的数据类型和位置不变，更改 CREATE TABLE 语句就能更改 column 的信


        #endregion

        #region 十二、删除列
        //SQLite 也没有提供删除列的命令。和上面一样，也是两种方式。
        //其一，把目标表改名，建立没有要删除列（字段）的新表，然后把旧表的数据拷贝至新表。
        //    其二，直接修改 schema 中建表的 SQL 语句。
        //    其中最主要的是要把建表的列的所有信息都保存下来，比如索引、缺省值之类的。下面示例使用第二种方式。




        #endregion

        #region 十三、插入数据
        private void button7_Click_1(object sender, EventArgs e)
        {
            string s = "123456";
            int n = 10;
            int myscore = 1;
            string path = Application.StartupPath + "\\test.db";
            SQLiteConnection cn = new SQLiteConnection("data source=" + path);
            if (cn.State != System.Data.ConnectionState.Open)
            {
                cn.Open();
                SQLiteCommand cmd = new SQLiteCommand();
                cmd.Connection = cn;
                //time string,id varchar(4),score int
                cmd.CommandText = "INSERT INTO t1(time,id,score,age) VALUES(@time,@id,@score,@age)";
                cmd.Parameters.Add("id", DbType.String).Value = s;
                cmd.Parameters.Add("age", DbType.Int32).Value = n;
                cmd.Parameters.Add("score", DbType.Int32).Value = myscore;
                cmd.Parameters.Add("time", DbType.String).Value = DateTime.Now.ToString();
                cmd.ExecuteNonQuery();
            }
            cn.Close();



        }
        #endregion

        #region 十四、替换数据
        //        string s = "123456";
        //        int n = 30;
        //        string s = "123456";
        //        int n = 30;
        //        cmd.CommandText = "REPLACE INTO t1(id,age) VALUES(@id,@age)";
        //cmd.Parameters.Add("id", DbType.String).Value = s;
        //cmd.Parameters.Add("age", DbType.Int32).Value = n;
        //cmd.ExecuteNonQuery();


        #endregion


        #region 十五、更新数据
        //SQL 命令 UPDATE tablename SET column1=value,column2=value... WHERE 条件
        private void button8_Click(object sender, EventArgs e)
        {
            string s = "333332222";
            int n = 1077777;
            int myscore = 1;
            string path = Application.StartupPath + "\\test.db";
            SQLiteConnection cn = new SQLiteConnection("data source=" + path);
            if (cn.State != System.Data.ConnectionState.Open)
            {
                cn.Open();
                SQLiteCommand cmd = new SQLiteCommand();
                cmd.Connection = cn;
                //time string,id varchar(4),score int
            
                cmd.CommandText = "UPDATE t1 SET id=@id,age=@age WHERE id='888'";
                cmd.Parameters.Add("id", DbType.String).Value = s;
                cmd.Parameters.Add("age", DbType.Int32).Value = n;
                cmd.ExecuteNonQuery();
               
            }
            cn.Close();

        }

        #endregion


        #region 十六、删除数据
        private void button9_Click(object sender, EventArgs e)
        {
   
            string path = Application.StartupPath + "\\test.db";
            SQLiteConnection cn = new SQLiteConnection("data source=" + path);
            if (cn.State != System.Data.ConnectionState.Open)
            {
                cn.Open();
                SQLiteCommand cmd = new SQLiteCommand();
                cmd.Connection = cn;
                //time string,id varchar(4),score int

                cmd.CommandText = "DELETE FROM t1 WHERE id='444'";
        
                cmd.ExecuteNonQuery();

            }
            cn.Close();
        }
        #endregion


        #region 十七、查询数据
        private void button10_Click(object sender, EventArgs e)
        {
            string path = Application.StartupPath + "\\test.db";
            SQLiteConnection cn = new SQLiteConnection("data source=" + path);
            if (cn.State != System.Data.ConnectionState.Open)
            {
                cn.Open();
                SQLiteCommand cmd = new SQLiteCommand();
                cmd.Connection = cn;
                //time string,id varchar(4),score int

                cmd.CommandText = "SELECT * FROM t1 WHERE rowid=2";
                SQLiteDataReader sr = cmd.ExecuteReader();
                
                while (sr.Read())
                {
                   string s = sr.GetString(0);
                    updatemessage(s);
                   // Console.WriteLine($"{sr.GetString(0)} {sr.GetInt32(1).ToString()}");
                }
                sr.Close();
                //运行以下的就能知道 rowid 并不能代表 行数
                //cmd.CommandText = "SELECT rowid FROM t1 ";
                //sr = cmd.ExecuteReader();
                //while (sr.Read())
                //{
                //    Console.WriteLine($"{sr.GetString(0)} {sr.GetInt32(1).ToString()}");
                //}
                //sr.Close();

            }
            cn.Close();



            //查询第1条记录，这个并不保险,rowid 并不是连续的，只是和当时插入有关
           
            
            
        }
        #endregion









        int updataindex = 0;
        void updatemessage(string content)
        {
            string Totallogcontent = DateTime.Now.ToString("yyyy年MM月dd日HH时mm分ss秒") + "\r\n" + content + "\r\n";
            this.UpdateTextBox.AppendText(Totallogcontent);
            updataindex++;
            if (updataindex > 600) { updataindex = 0; UpdateTextBox.Clear(); }
        }

    
    }
}
